package com.shujia.jichu

/**
 * 函数：在object内部编写
 * 方法(成员方法)：在class内部编写
 */
object Demo4Fun {
  /**
   * def: 定义函数或者方法的关键字
   * main: 函数名 main函数是被java虚拟机所特有识别的程序入口
   * args: 参数名
   * Array[String]: 参数的数据类型
   * Unit: 返回值类型 相当于java中的void
   *
   *
   * def main(args: Array[String]): Unit = {}
   * public static void main(String[] args){}
   *
   * 函数的定义
   * 1、可以在object对象中任意一个地方定义
   * 函数的调用
   */
  def main(args: Array[String]): Unit = {
    val res1: Int = add(3, 4)
    println(res1)

    def plus(a: Int, b: Int): Int = {
      return a + b
    }

    val res2: Int = plus(10, 20)
    println(res2)

    /**
     * 函数的调用
     * 1、在object对象内部，函数相当于加了一个static，将来调用的时候，可以使用object对象名进行调用
     * 2、在同一作用域中，调用时可以不加对象名
     *
     */
    println(Demo4Fun.add(11,22))
    println(add(12,23))
    println("=" * 50)

    /**
     * 函数的调用也可以简写
     */
    val s1: String = "java,hadoop,scala"
//    val array1: Array[String] = s1.split(",")

    //如果要调用的函数有且仅有一个参数的时候，可以像下面这样简写
    val array2: Array[String] = s1 split ","
    println("=" * 50)
    println(Demo4Fun add6 10)
  }

  //定义了一个函数，有两个int类型的参数，返回值也是int类型
  def add(x: Int, y: Int): Int = {
    return x + y
  }

  def add6(x: Int): Int = {
    x+200
  }

  /**
   *  定义函数时的简写
   *  1、如果函数体中最后一行语句作为返回值的时候，return可以省略不写
   *  2、如果函数体中只有一行语句实现，那么大括号也可以不用编写
   *  3、函数的返回值可以进行自动类型推断，可以省略不写
   *  4、如果函数没有参数列表的话，()也可以省略不写，def add5 = println("好好学习，天天向上")
   */
  //1、如果函数体中最后一行语句作为返回值的时候，return可以省略不写
  def add2(x: Int, y: Int): Int = {
    x + y
  }

  //2、如果函数体中只有一行语句实现，那么大括号也可以不用编写
  def add3(x: Int, y: Int): Int = x + y

  //3、如果函数体中只有一行语句实现，那么大括号也可以不用编写
  def add4(x: Int, y: Int) = x + y

  //4、如果函数体中只有一行语句实现，那么大括号也可以不用编写
  def add5 = println("好好学习，天天向上")



}
